操作系统-进程管理

1.什么是进程?

进程就是处于执行器的程序,但是进程不仅限于一段可以执行的代码。通常进程还要包括许多其他的资源,像打开的文件,挂起的信号,内核内部数据,处理器状态,一个或者多个具有内存映射的内存地址空间以及一个或者多个执行线程,当然还包括用来存放全局变量的数据段等。

程序本身不是线程,线程是处于执行期的程序和其他资源的总称。

2.什么是线程?

线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。

3.进程和线程区别?

1)同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间;
2)同一进程内的线程共享本进程的资源,但是进程之间的资源是独立的;
3)一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程崩溃,所以多进程比多线程健壮;
4)进程切换,消耗的资源大。所以涉及到频繁的切换,使用线程要好于进程;
5)线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以进程间通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。
6)每个独立的进程有一个程序的入口、程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

4.进程状态转换

在这里插入图片描述
运行状态:进程正在处理机上运行。在单处理机环境下,每一时刻最多只有一个进程处于运行状态。

就绪状态:进程已处于准备运行的状态,即进程获得了除处理机之外的一切所需资源,一旦得到处理机即可运行。

阻塞状态,又称等待状态:进程正在等待某一事件而暂停运行,如等待某资源为可用(不包括处理机)或等待输入/输出完成。即使处理机空闲,该进程也不能运行。

就绪状态 -> 运行状态:处于就绪状态的进程被调度后,获得处理机资源(分派处理机时间片),于是进程由就绪状态转换为运行状态。

运行状态 -> 就绪状态:处于运行状态的进程在时间片用完后,不得不让出处理机,从而进程由运行状态转换为就绪状态。此外,在可剥夺的操作系统中,当有更高优先级的进程就绪时,调度程度将正执行的进程转换为就绪状态,让更高优先级的进程执行。

运行状态 -> 阻塞状态:当进程请求某一资源(如外设)的使用和分配或等待某一事件的发生(如I/O操作的完成)时,它就从运行状态转换为阻塞状态。

阻塞状态 -> 就绪状态:当进程等待的事件到来时,如I/O操作结束或中断结束时,中断处理程序必须把相应进程的状态由阻塞状态转换为就绪状态。

5.fork()函数

子进程得到与父进程用户级虚拟地址空间相同(但是独立的)一份副本,包括代码和数据段、堆、共享库以及用户栈。子进程还获得与父进程任何打开文件描述符相同的副本。

(1)调用一次,返回两次。fork函数被父进程调用一次,但是却返回两次——一次是返回到父进程,一次是返回到新创建的子进程。在父进程中,fork返回子进程的PID。在子进程中,fork返回0。

(2)并发执行。父进程和子进程是并发运行的独立进程。内核能够以任意方式交替执行它们的逻辑控制流中的指令。

(3)相同但是独立的地址空间。如果能够在fork函数在父进程和子进程返回后立即暂停这两个进程,我们会看到两个进程的地址空间都是相同的。每个进程有相同的用户栈、相同的本地变量值、相同的堆、相同的全局变量值,以及相同的代码。
共享文件。子进程继承了父进程所有的打开文件。

6.进程通信

1)管道
管道,通常指无名管道。
①半双工的,具有固定的读端和写端;
②只能用于具有亲属关系的进程之间的通信;
③可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write函数。但是它不是普通的文件,并不属于其他任何文件系统,只能用于内存中。
④Int pipe(int fd[2]);当一个管道建立时,会创建两个文件文件描述符,要关闭管道只需将这两个文件描述符关闭即可。

2**)FiFO(有名管道)**
①FIFO可以再无关的进程之间交换数据,与无名管道不同;
②FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中;
③Int mkfifo(const char* pathname,mode_t mode);

3)消息队列
①消息队列,是消息的连接表,存放在内核中。一个消息队列由一个标识符来标识;
②消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级;
③消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除;
④消息队列可以实现消息的随机查询

4)信号量
①信号量是一个计数器,信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据;
②信号量用于进程间同步,若要在进程间传递数据需要结合共享内存;
③信号量基于操作系统的PV操作,程序对信号量的操作都是原子操作;

5)共享内存
①共享内存,指两个或多个进程共享一个给定的存储区;
②共享内存是最快的一种进程通信方式,因为进程是直接对内存进行存取;
③因为多个进程可以同时操作,所以需要进行同步;
信号量+共享内存通常结合在一起使用

7.守护进程

1.守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进程。

2.守护进程特点
1)守护进程最重要的特性是后台运行。
2)守护进程必须与其运行前的环境隔离开来。这些环境包括未关闭的文件描述符,控制终端,会话和进程组,工作目录以及文件创建掩模等。这些环境通常是守护进程从执行它的父进程(特别是shell)中继承下来的。
3)守护进程的启动方式有其特殊之处。它可以在Linux系统启动时从启动脚本/etc/rc.d中启动,可以由作业规划进程crond启动,还可以由用户终端(shell)执行。
3.实现
1)在父进程中执行fork并exit推出;
2)在子进程中调用setsid函数创建新的会话;
3)在子进程中调用chdir函数,让根目录 ”/” 成为子进程的工作目录;
4)在子进程中调用umask函数,设置进程的umask为0;
在子进程中关闭任何不需要的文件描述符

8.程序加载的过程

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值