[操作系统]进程和线程

目录

1.什么是进程

1.1进程控制块抽象

1.2 CPU 分配 —— 进程调度(Process Scheduling)

1.3内存分配 —— 内存管理(Memory Manage)

1.4进程间通信(Inter Process Communication)

2.线程

 2.1概念

2.2为什么要有线程

2.3线程和进程的区别

2.4 Java线程和操作系统线程的关系

3.使用Java代码来实现多线程程序

3.1.继承Thread类来实现

3.2实现Runnalbe接口

3.3匿名内部类创建Thread子类对象

3.4匿名内部类创建Runnable类对象

3.5 多线程的优势-增加运行速度


1.什么是进程

  每个应用程序运行于现代操作系统上的时候,操作系统会提供一种抽象,好像系统上只有这个程序在运行,所有的硬件资源都是这个程序在使用。这种假象是通过抽象了一个进程的概念来完成的,进程可以说是计算机科学最重要和最成功的概念之一。

进程是操作系统对一个正在运行的程序的一种抽象,换言之,可以把进程看做程序的一次运行过程;同时,在操作系统内部,进程又是操作系统进行资源分配的基本单位.

1.1进程控制块抽象

   计算机内部要管理任何现实事物,都需要将其抽象成一组有关联的、互为一体的数据。在 Java 语言中,我们可以通过类/对象来描述这一特征.

// 以下代码是 Java 代码的伪码形式,重在说明,无法直接运行
class PCB {
// 进程的唯一标识 —— pid;
// 进程关联的程序信息,例如哪个程序,加载到内存中的区域等
// 分配给该资源使用的各个资源
// 进度调度信息
}

    这样,每一个 PCB 对象,就代表着一个实实在在运行着的程序,也就是进程。
操作系统再通过这种数据结构,例如线性表、搜索树等将 PCB 对象组织起来,方便管理时进行增删查改的操作.


1.2 CPU 分配 —— 进程调度(Process Scheduling)

  为了便于讨论和理解,我们大部分的场景下假设是单CPU单核的计算机。
操作系统对CPU资源的分配,采用的是时间模式 —— 不同的进程在不同的时间段去使用 CPU 资源。

1.3内存分配 —— 内存管理(Memory Manage)

  操作系统对内存资源的分配,采用的是空间模式 —— 不同进程使用内存中的不同区域,互相之间不会干扰。
 

1.4进程间通信(Inter Process Communication)

   如上所述,进程是操作系统进行资源分配的最小单位,这意味着各个进程互相之间是无法感受到对方存在的,这就是操作系统抽象出进程这一概念的初衷,这样便带来了进程之间互相具备”隔离性
  (Isolation)“。
  但现代的应用,要完成一个复杂的业务需求,往往无法通过一个进程独立完成,总是需要进程和进程进行配合地达到应用的目的,如此,进程之间就需要有进行“信息交换“的需求。进程间通信的需求就应运而生。
目前,主流操作系统提供的进程通信机制有如下:
1. 管道
2. 共享内存
3. 文件
4. 网络
5. 信号量
6. 信号
 其中,网络是一种相对特殊的 IPC 机制,它除了支持同主机两个进程间通信,还支持同一网络内部非同一主机上的进程间进行通信.
 

2.线程

 2.1概念

一个线程就是一个'执行流',每个线程之间都可以按照顺序执行自己的代码,多个线程之间'同时'执行着多份代码

举个例子,比如我现在要去搬家,我一个人忙不过来,喊了张三和李四一起来.然后我们三个人一人负责一件事,我负责搬家电,张三负责开车,李四负责收拾.但是本质上我们三个人是办的搬家这一件事.

 此时我们就可以把这种情况称为多线程,将一个大任务分解成不同的小任务,交给不同执行流分别执行,其中张三和李四是我叫来的,所以我一般被称为主线程.

2.2为什么要有线程

 

   首先 , " 并发编程 " 成为 " 刚需 ".
单核 CPU 的发展遇到了瓶颈 . 要想提高算力 , 就需要多核 CPU. 而并发编程能更充分利用多核 CPU
资源 .
有些任务场景需要 " 等待 IO", 为了让等待 IO 的时间能够去做一些其他的工作 , 也需要用到并发编

  其次 , 虽然多进程也能实现 并发编程 , 但是线程比进程更轻量 .
创建线程比创建进程更快 .
销毁线程比销毁进程更快 .
调度线程比调度进程更快   


2.3线程和进程的区别

进程是包含线程的.每个进程至少有一个线程存在,即主线程。
进程和进程之间不共享内存空间 . 同一个进程的线程之间共享同一个内存空间 .
进程是系统分配资源的最小单位,线程是系统调度的最小单位。

2.4 Java线程和操作系统线程的关系

线程是操作系统中的概念. 操作系统内核实现了线程这样的机制, 并且对用户层提供了一些 API 供用户使用(例如 Linux 的 pthread 库).
Java 标准库中 Thread 类可以视为是对操作系统提供的 API 进行了进一步的抽象和封装

3.使用Java代码来实现多线程程序

3.1.继承Thread类来实现

package demo;class MyThread extends Thread{@Overridepublic void run() {while (true){System.out.println("这是线程运行的代码");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}
public class Test {public static void main(String[] args) {MyThread myThread = new MyThread();myThread.start();while (true){System.out.println("main函数");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}

使用Javabin自带的jconsole来观察线程

 上图是一个main线程

3.2实现Runnalbe接口

package demo1;
class MyThread implements Runnable{@Overridepublic void run() {System.out.println("Runable");}
}public class Test {public static void main(String[] args) {Thread myThread = new Thread(new MyThread());myThread.start();}
}

3.3匿名内部类创建Thread子类对象

package demo2;public class Test {public static void main(String[] args) {Thread thread = new Thread(){@Overridepublic void run() {System.out.println("匿名内部类创建子类对象");}};}
}

3.4匿名内部类创建Runnable类对象

package demo3;public class Test {public static void main(String[] args) {Runnable runnable = new Runnable() {@Overridepublic void run() {System.out.println("匿名内部类创建Runnable类对象");}};}
}

3.5lambda表达式创建Runnable子类对象

package demo4;public class Test {public static void main(String[] args) {Thread runnable = new Thread(() -> {System.out.println("hello");});}
}

3.5 多线程的优势-增加运行速度

可以观察多线程在一些场合下是可以提高程序的整体运行效率的。
使用 System.nanoTime() 可以记录当前系统的 纳秒 级时间戳.
serial 串行的完成一系列运算. concurrency 使用两个线程并行的完成同样的运算.
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/207804.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里巴巴国际站自养号测评方式提升星级的优势与要求

作为国际站的商家,都明白星等级这个重要指标的重要性。它像一块闪耀的招牌,不仅彰显了商家的运营能力,还体现了公司的实力。维护一个高等级的星等级,可以使商家的运营工作更加轻松,而低等级则需要花费更多的精力。提升…

TikTok Shop订单狂涨,黑五全托管品类日卖爆了

01 黑五品类日爆单 显然,TikTok Shop在美国的首个黑五大促收获了胜利的果实。 根据最新发布的数据,TikTok Shop全托管黑五六大品类日支付GMV(总交易额)和支付量双双实现大幅度增长。举其中几个具体数据来看,女装童鞋…

redis运维(十五) 集合

一 集合 ① 概念 集合的元素在redis里面的世界是member集合: setset集合当中不允许重复的元素,而且set集合当中元素是没有顺序的,不存在元素下标 ② sadd、smembers、srem ③ sismember、srandmember、spop、scard spop 命令用于移除集合中的指定 …

【Django-DRF】多年md笔记第5篇:Django-DRF的Request、Response和视图详解

本文从分析现在流行的前后端分离Web应用模式说起,然后介绍如何设计REST API,通过使用Django来实现一个REST API为例,明确后端开发REST API要做的最核心工作,然后介绍Django REST framework能帮助我们简化开发REST API的工作。 Dj…

人工智能基础部分22-几种卷积神经网络结构的介绍,并用pytorch框架搭建模型

大家好,我是微学AI,今天给大家介绍一下人工智能基础部分22-几种卷积神经网络结构的介绍,本篇文章我将给大家详细介绍VGG16、VGG19、ResNet、SENet、MobileNet这几个卷积神经网络结构,以及pytorch搭建代码,利用通用数据…

【tomcat】java.lang.Exception: Socket bind failed: [730048

项目中一些旧工程运行情况处理 问题 1、启动端口占用 2、打印编码乱码 ʮһ�� 13, 2023 9:33:26 ���� org.apache.coyote.AbstractProtocol init ����: Fa…

基于python人脸性别年龄检测系统-深度学习项目

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介简介技术组成1. OpenCV2. Dlib3. TensorFlow 和 Keras 功能流程 二、功能三、系统四. 总结 一项目简介 # Python 人脸性别年龄检测系统介绍 简介 该系统基…

Android : ListView + BaseAdapter-2简单应用

​​容器与适配器:​​​​​ http://t.csdnimg.cn/ZfAJ7 实体类 News.java package com.example.mylistviewadapter2.entity;public class News {private String title;private String content;private int img;public News(String title, String conte…

Linux中的进程程序替换

Linux中的进程程序替换 1. 替换原理2. 替换函数3. 函数解释4. 命名理解程序替换的意义 1. 替换原理 替换原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的…

智慧法院档案数字化解决方案

智慧法院档案数字化解决方案可以采用以下步骤: 1. 确定数字化目标:明确数字化的目标和范围,比如将所有的案件相关文件、纸质档案和材料进行数字化。 2. 确定数字化流程:制定数字化的流程和标准,比如采用哪些设备和软件…

解决requests库进行爬虫ip请求时遇到的错误的方法

目录 一、超时错误 二、连接错误 三、拒绝服务错误 四、内容编码错误 五、HTTP错误 在利用requests库进行网络爬虫的IP请求时,我们可能会遇到各种错误,如超时、连接错误、拒绝服务等等。这些错误通常是由目标网站的限制、网络问题或我们的爬虫代码中…

docker、elasticsearch8、springboot3集成备忘

目录 一、背景 二、安装docker 三、下载安装elasticsearch 四、下载安装elasticsearch-head 五、springboot集成elasticsearch 一、背景 前两年研究了一段时间elasticsearch,当时也是网上找了很多资料,最后解决个各种问题可以在springboot上运行了…