(三)进程

一、进程概念
进程是程序执行的一个实例。操作系统会以进程为单位,分配系统资源,进程是资源分配的最小单位。

Linux进程的四大要素

1:一段供进程执行的程序,该程序可以被多个进程执行。

2:独立的内核堆栈。

3:进程控制快(task_struct:有了这个数据结构,进程才能成为内核调度的一个基本单位接受内核的调度。同时,这个结构还记录着进程所占用的各项资源。

4:独立的存储空间:即拥有专有的用户空间,除了前面的内核空间还有用户空间。

二、进程描述符
1.进程描述符包含了与一个进程相关的所有信息。
struct task_struct{
 进程信息
 }

2.进程描述符处理
对于每一个进程而言,内核为其单独分配了一个内存区域,这个区域存储的是内核栈和该进程所对应的一个小型进程描述符——thread_info结构。
struct thread_info { 

}

三、进程状态

  可运行(TASK_RUNNING)

  可中断的等待(TASK_INTERRUPTBLE)

  不可中断的等待(TASK_UNINTERRUPTILBE)

  暂停(TASK_STOPPED)

  跟踪(TASK_TRACED)

  僵死(TASK_ZOMBIE)

  僵死撤销(EXIT_DEAD)

线程
线程存在于进程当中,是操作系统调度执行的最小单位。说通俗点,线程就是干活的。

四、进程间关系

进程0和进程1由内核创建,进程1(init)是其他所有进程的祖先。

五、进程与等待队列
等待队列(wait queue)用于使进程带等待某一特定的事件发生,而无需频繁的轮询操作,进程在等待时间内睡眠,在等待的事件发生时由内核自动唤醒

1.等待队列相关数据结构
每一个等待队列都由两部分组成:等待队列头(struct wait_queue_head_t)和等待队列成员(struct wait_queue)。

  1. struct __wait_queue_head {
  2. spinlock_t lock; /*因为等待队列可以在中断时随时修改,因此设置一个自旋锁保证一致性*/
  3. struct list_head task_list;
  4. };
  5. typedef struct __wait_queue_head wait_queue_head_t;
  6. struct __wait_queue {
  7. unsigned int flags; /*指明等待的进程是互斥进程还是非互斥进程*/
  8. struct task_struct *task; /*指向任务的task_struct*/
  9. wait_queue_func_t func;
  10. struct list_head task_list;
  11. };
  12. typedef struct __wait_queue_head wait_queue_head_t

2.等待队列的使用分为以下两部分:

(1)为使当前进程在一个等待队列中睡眠,需要调用wait_event(或某个等价函数),此后,进程进入睡眠,将控制权交给调度器。以块设备为例,当内核向块设备发出请求后,因为数据传输不会立即发生,因此进程睡眠

(2)相对应的,是当数据到达后,必须调用wake_up函数(或某个等价函数)来唤醒等待队列中睡眠的进程

五、进程创建

fork   vfork

时间: 2024-12-22 11:15:07

(三)进程的相关文章

实验三 进程模拟调度

1. 目的和要求 实验目的 用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解. 实验要求 设计一个有 N(N不小于5)个进程并发执行的进程调度模拟程序. 进程调度算法:“时间片轮转法”调度算法对N个进程进行调度. 2. 实验内容 完成两个算法(简单时间片轮转法.多级反馈队列调度算法)的设计.编码和调试工作,完成实验报告. 1) 每个进程有一个进程控制块(PCB)表示.进程控制块包含如下信息:进程名.优先级.到达时间.需要运行时间.已用CPU时间.进程状态等等. 2) 每个进

实验三 进程模拟调度程序

1.    目的和要求 1.1.           实验目的 用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解. 1.2.           实验要求 1.2.1例题:设计一个有 N个进程并发执行的进程调度模拟程序. 进程调度算法:采用最高优先级优先的调度算法(即把处理机分配给优先级最高的进程)和先来先服务(若优先级相同)算法. (1).  每个进程有一个进程控制块(PCB)表示.进程控制块包含如下信息:进程名.优先级.到达时间.需要运行时间.已用CPU时间.进程状态等

实验三 进程延续

#include<stdio.h>#define N 10typedef struct jincheng //进程结构体定义 { char name; int arrive; int prio; int needTime; }JinCheng; void shuru(JinCheng a[],int n){ //输入进程基本信息 int i; for(i=0;i<n;i++) { printf("请输入%d进程的程序名:",i+1); scanf("%c&q

Linux网络编程学习(三) ----- 进程控制实例

本节主要介绍一个进程控制的实例,功能就是在前台或者后台接收命令并执行命令,还能处理由若干个命令组成的命令行,该程序命名为samllsh. 基本逻辑就是 while(EOF not typed) { 从用户终端取得命令行 执行命令 } setp1:取得命令行内容,用uerin函数实现,处理步骤首先显示提示符,提示符的具体内容由用户通过参数传递给函数,然后每次从键盘读取一个字符,存入inpbuf中,结束时userin返回字符个数或者EOF(文件结尾),换行符也要存入inpbuf 代码如下: #inc

2009 三进程奇偶访问缓冲区

sem odd=0,even=0,empty=n,mutex1; p1() { x=produce(); p(empty); p(mutex); put(); v(mutex); if(x%2==0) v(even); else v(odd); } p2() { p(odd); p(mutex); getodd(); v(mutex); v(empty); countodd(); } p3() { p(even); p(mutex); geteven(); v(mutex); v(empty);

双进程守护,驻留,杀不死服务

这是一个轻量级的库,配置几行代码,就可以实现在Android上实现进程常驻,也就是在系统强杀下,以及360获取root权限下,clean master获取root权限下都无法杀死进程 支持系统2.3到6.0 支持大部分设备,包括三星,华为,oppo,nexus,魅族等等 可以简单对开机广播进行保护 github地址: https://github.com/Marswin/MarsDaemon 原理分析: Android 进程常驻(0)----MarsDaemon使用说明 Android 进程常驻

走进windows编程的世界-----windows进程

Windows进程  1 Windows进程    进程是一个容器,包含了一个应用程序实例的各种资源.Windows多任务的操作系统,因此可以同时执行多个进程.      2 Windows进程的一些特点    2.1 进程中包含了执行代码等资源.    2.2 进程都具有私有的地址空间.    2.3 每个进程都有一个ID,标识进程.    2.4 每个进程都有自己的安全属性    2.5 至少要包含一个可以执行的线程.    二 进程的环境 1 环境信息的获取    获取:    LPVOI

Linux 常见的进程调度算法

1.在介绍进程调度之前,先对进程的状态的概念应该有所了解,下面是关于进程状态的一些基本概念:进程的状态分为三种,分别为: 1).运行态:该状态表明进程在实际占用CPU 2).就绪态: 该状态下进程可以运行,但因为其他进程正在运行而暂时停止 3).阻塞态: 该状态下进程不能运行,除非某种外部事件的发送 运行态→等待态 往往是由于等待外设,等待主存等资源分配或等待人工干预而引起的. 等待态→就绪态 则是等待的条件已满足,只需分配到处理器后就能运行. 运行态→就绪态 不是由于自身原因,而是由外界原因使

Python:线程、进程与协程(4)——multiprocessing模块(1)

multiprocessing模块是Python提供的用于多进程开发的包,multiprocessing包提供本地和远程两种并发,通过使用子进程而非线程有效地回避了全局解释器锁. (一)创建进程Process 类 创建进程的类,其源码在multiprocessing包的process.py里,有兴趣的可以对照着源码边理解边学习.它的用法同threading.Thread差不多,从它的类定义上就可以看的出来,如下: class Process(object):     '''     Proces

进程和计划任务

当今的电脑使用的cpu一般是多核的,并且多个进程同时运行,一个cpu同时只能运行一个指令,怎么实现多个进程同时运行这就是一门艺术了.实现多种多样的功能需要把进程分类,指定进程的权限,指定一个进程的管控其它进程,以保证其它进程权限的正确运用. 一 进程类型 进程是运行中程序,进程运行时需要先先把程序加载到内存里,然后cpu加载进程中的指令处理数据.进程处理完数据后就会停止,并把数据交付其它进程,交付数据的可能并不是由自己完成.以下以单核cpu为例介绍,多核工作的理念和单核的一样,只是工作的复杂度更