1.3 进程、线程

进程与线程简述

1:进程与线程

进程

进程(Process )是一个具有独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。

  对于一个进程来说在进程的执行过程中他拥有:自己的文本域来储存执行代码、自己的数据域来储存变量与动态分配的内存、自己的堆栈域来储存活动过程调用的指令和本地变量。它犹如我们前后台编程的程序一般,在执行时即拥有数据,有拥有任务的控制流程。对于大多数著名的操作系统,进程是基本单位。

线程

线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。

线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪阻塞和运行三种基本状态。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。  线程是程序中一个单一的顺序控制流程。在单个程序中同时运行多个线程完成不同的工作,称为多线程。 一般一个cpu在同一时间只能运行一个线程。

2:简单的进程编程。

程序简述:

在前几节的学习中我们掌握了一些基本的程序的写法,其实我们在不知不觉中系统就为我们分配了一个进程。linux系统可以说是一个以进程为基础的操作系统(区别于μC/OS系统,此系统是一个以线程为基础的操作系统)。标准的解释为:“进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示”。可以说我没在pc上使用的各种软件都是靠进程组建起来的。小的程序可能只有一个文件,而大的程序为了处理复杂的任务则常常选择多进程编程而实现。进程作为多任务操作系统系统实现多任务同时运行的重要机制,有较多的知识需要理解。本节作为进程编程的入门教程,主要需要掌握“进程的建立”“父子进程以及兄弟进程间的关系”以及“理解进程对资源的分配方式”,至于进程间的通信问题主要留在后面的章节来详细说明。

重点掌握函数:

fork();  

sleep();

注意:

1.第一次运行完本程序时,运行结果可能不符合逻辑上的关系{主要是使用kata(kde环境下的著名文本编辑器,允许在编辑中内嵌gcc等,类似于gedit)编译器为gcc时}。这主要是由于程序比较小加上kata本身bug造成的。多云行几次(>3次)或者甘脆在系统终端中运行会消除这种现象。

2.由于“编译环境”“pc机本身cpu核数”以及“系统环境”的不同,最后输出结果应该是两条语句无顺序的输出(单核pc永远不可能真正的做到多任务同时进行,大多都是任务争夺cpu时间或时钟块轮转)。

3.由进系统分配内存空间给每一个任务.因此所有“进程外”但在整个程序中的静态变量/静态常量/全局变量等资源会被系统完整的复制出几分给所有的进程,不管进程是否有用,同时同一个全局变量的直在一个进程中改变了不会影响到另一个进程中的这个数值(很重要,因此需要考虑任务间的通信问题)。所以进程的建立会大量的占用内存资源(区别于线程)。

4.可通过终端输出的i的值来判断运行到那个进程的次数。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
int main()
{
    int i;
 
    int pid=fork();//建立进程,fork一共会返回两次,产生两个进程
 
    if(pid < 0)      //判断进程是否建立成功
        {
        printf("error!");
        }
    else
        if(pid==0)//子进程函数体
            {
for(i=0;i<50;i++)
{
printf("%d I'm a subprocess!!!\n",i);
sleep(0.5);//使任务睡眠(挂起)0.5秒,类似于延时函数但此函数	      //会自动在挂起的时间内为任务释放cpu。
}
            }
        else
            {//父进程函数体
for(i=0;i<50;i++)
{
<span style="white-space:pre">	</span>printf("%d I'm a parent process!!!\n",i);
<span style="white-space:pre">	</span>sleep(0.5);
}
            }
 
}


 

3:简单的线程编程

程序简述:

对于linux系统主要是由进程支持其来的操作系统,但是在系统中还有着另外一种可以用于多任务运行的机制:线程,甚至可以说进程就是由线程加入对其分配的各种空间而组成的。因此线程可以说是"进程"中某个单一顺序的控制流,也被称为轻量进程(简单说,线程可以说为任务执行时的过程的。但要注意建立起来的进程与线程在运行时就独立了,每个进程或线程都是一个任务。)。

由于linux的进程建立依赖于线程(简单理解为:你的每个程序都会至少分配一个进程,而进程内所写的任务可以用线程的方式或者说程序除去各种常/变量后的部分就是一个线程。还有ucos使用的是直接建立线程有兴趣可以自己去看看。),而且线程自己不拥有系统资源,所以它可以使用所在进程中的全局变量(看情况而来,有时也要使用任务间的通信)。

为了解决线程的在使用全局变量时会发生多个线程同时使用一个变量的情况,因此系统为任务间的通信提供了互斥机制(进程中也会用到属于任务间通信的一种最简单常用的方式)。本程序使用了互斥锁来实现进程间的互不影响

重点掌握函数:

      pthread_mutex_init;   

pthread_create;     

pthread_mutex_lock;  

pthread_mutex_unlock;

注意:

区别于进程,由于线程几乎不持有系统资源,所以可以共用全局变量,只是要考虑持有的顺序。(注意加锁后线程不要一直占用资源,不然会发生死锁!!!多在所外加点sleep什么的叫线程挂起一会)

#include<stddef.h>
#include<stdio.h>
#include<unistd.h>
#include"pthread.h"

void reader_function(void);//用于线程的两个任务
void writer_function(void);//用于线程的两个任务
char buffer;		//其实程序就是在不停地将这个变量不停的置成'a',然后					//再清空为'\0'
int buffer_has_item=0;	//判断该执行哪个任务(一个标志位,防止两个线							//程不顺序运行)
pthread_mutex_t mutex;	//建立互斥锁必需的变量
main()
{
    pthread_t reader;	//线程的
    pthread_mutex_init(&mutex,NULL);//启动互斥锁
    pthread_create(&reader,NULL,(void*)&reader_function,NULL);//建立							//线程
    writer_function();//另一个任务,内部有一个死循环。其实他也算是一个		//线程(因为他是这个进程中最后不停执行的一个任务,就是一个线程。)
}
void writer_function(void)
{
    while(1)
    {
        pthread_mutex_lock(&mutex);//开启互斥锁
        if(buffer_has_item==0)	//判断是否该执行
        {
	    	  buffer='a';		// 将buffer置成'a'
            printf("make a new item\n");//输出完成
            buffer_has_item=1;	//标志至一
        }
        pthread_mutex_unlock(&mutex);//关比互斥锁
    }
}
void reader_function(void)//同 writer_function
{
    while(1)
    {
        pthread_mutex_lock(&mutex);
        if(buffer_has_item==1)
        {
	    buffer='\0';
            printf("consume  item\n");
            buffer_has_item=0;
        }
        pthread_mutex_unlock(&mutex);
    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值