운영 체제 : 리눅스 프로세스와 스레드

여기에 내용의 일부이지만, 또한 변경합니다.

하나 : 목적과 내용

는 pthread 라이브러리 함수를 사용하여, 포크 ​​() 간부 학습, 소스 코드를 판독 포크, 간부,는 pthread_create 기능의 메커니즘을 분석

코드 구현 :

프로세스는 자식 프로세스 B를 만들

부모 자식 프로세스 B와 A는 각각 서로 다른 실행 파일에 해당합니다 인쇄 안녕하세요 세계, B 누적 합계가 구현

B는 세 개의 프로세스 스레드를 가지고, 메인 쓰레드 (파라미터 X 1에서) 누적 합을 달성하는 새로운 스레드, 스레드 2 모니터 입력 변수 (X)를 생성

입력 x는 음이 아닌 정수, 카운트 스레드 일 경우, 스레드 1은 이전 프로그램, 입력 스레드 2 음이 아닌 정수 1을 다시 계산해야 마지막 스레드는 다른 계산하는 경우, 동일하게 재 계산하지 않으면

당신은 문자 p를 입력하면, 다음 1 개 스레드가 중단.

A와 B 출구의 전체 프로세스의 스레드 정보를 종료 한 후 문자 전자 (1) 인쇄를 입력

다른 문자를 입력하면, 스레드 1은 입력 오류를 인쇄 작업이 계속

실행 파일 실행의 각 등 기본 정보 프로세서 사용량, 메모리 사용량, 분석

두 단계

참고

리눅스 C 프로그래밍 --fork () 상세 - 장 진, A - CSDN 블로그 

[동시 병렬] _ [pthread에] _ - 진정 - CSDN 블로그 [- 일시 정지 - 노동자의 간단한 제어 스레드 중지 - 계속]을

리눅스 멀티 태스킹 프로그래밍 (C) --- 기능과 기본적인 실험의 간부 인 가족 - 왕 좡어의 블로그 - CSDN 블로그

blankqdb - - 블로그 공원 리눅스 멀티 스레드 프로그래밍 및 여러 매개 변수 인스턴스를 전달

일시 중지 및 pthread와 스레드에 대한 논의 재개 - 하루 동안 작은 단계 - CSDN 블로그

요청의 주제는 두 가지 실행이 A와 B를 찾을 필요 첫 번째 A, 다음 B. 디자인의 모듈 형 설계 원칙

1. 절제, 묻는 질문에 따라, 프로세스 A에 대한 코드를 작성하는

#INCLUDE 제공 포크 () 때 execlp () 함수

#INCLUDE <SYS / wait.h> 제공된 대기 () 함수

#INCLUDE 된 pid_t의 유형의 정의를 제공

코드는 주로 자식 프로세스를 만들기 위해서, 자식 프로세스는 새로운 프로세스 이미지로 현재 프로세스 이미지를 대체 비교적 간단하다.


 

코드 뒤에 자식 프로세스 B를 적는다

모듈 식 설계 방식을 최대한 활용.

첫째, 헤더 파일

사용법 #include <pthread.h를>는 pthread 라이브러리 함수를 제공한다

리눅스는 기본 라이브러리는 pthread 없기 때문에 참고, 플러스 -lpthread GCC는 컴파일 시간


 

몇 전역 변수 후, 문제가 스레드 사이에 매개 변수를 전달을 줄일 수 있습니다.


 

1. 메인 스레드

함수는 두 개의 서브 - 스레드, 스레드 2 모니터링 입력, 스레드 1 인쇄 정보를 생성하고 누적 계산한다.

스레드 종료는 1, 2 황제 스레드가 종료가되면.

자식 스레드를 만들 수는 pthread_create 사용합니다.

실 끝을 기다리고 pthread_join을 사용하여


 

2. 스레드 2

스레드 (2) 입력을 모니터링, 그래서하기 때문에 첫 번째 스레드 (2)를 작성합니다.

스레드 2 부 :

주 처리 입력.

자세한 내용은 코드의 사진과 설명을 참조하십시오.

여기에 C ++ 사용되는 입력 문자열을 처리, 제한 입력 타입이 없기 때문에


 

스레드 2 파트 II :

FUNC는 입력 값에 따라 결정된다. 전역 변수로 스레드 1 FUNC 조정 상태

동시에 최근 칼과 다시 계산할지 여부를 결정합니다. 목표 축적 처의 최초부터 1 스레드이다.


 

스레드 2 제 3 부 :

스레드의 제 2 부분이 얻어 작동 상태에 따라 조정 한 FUNC.

FUNC의 == 2 pthread_join을 사용 ()는 에러 메시지, 종료를 차례로 인쇄 스레드 1 기다린다.

pthread_suspend () pthread_resume () 함수는 현탁 스레드를 달성하기 정의 자신의 함수이다. 상세한 설명의 구현을 일시 중단 실험 보고서의 다음 부분을 참조하십시오.


 

3. 스레드 1

첫 번째 부분은 : 스레드 1을 일시 정지합니다.

이용

에 pthread_mutex_lock () pthread_mutexunlock ()는 pthread_cond_wait (), 어떤 pthread_cond_broadcast ()는 스레드를 정지한다.

소스는 더 명확하게 구현 프로세스를 일시 중단 구현.


 

 

 

파트 II : 스레드 1은 출력 된 조작 정보를 축적

동작 두 입력이 동일한 다른 동작 설정을 반영하기 위해, P 자. 사람들이 컴퓨터가 아직 도착하지 않은 두 번째 입력으로 이어지는, 속도를 계산하여 입력 할 그렇지 않으면 속도가 좋지 않아, 우리는 마지막 결과에 올 수 있습니다.

 


 

요약하면, 다음과 같은 구조 B의 방법

pthread_suspend 보이드 (공극)

보이드 pthread_resume (냉혈한)

thread1 보이드 (공극 *의 ARG)

thread2 보이드 (공극 *의 ARG)

() 주요 int로

III. 실행 파일 실행의 각 등 기본 정보 프로세서 사용량, 메모리 사용량, 분석

터미널 A에서 실행중인 모든 프로세스의 우선


 

pgrep 是通过程序的名字来查询进程的工具,一般是用来判断程序是否正在运行。在服务器的配置和管理中,这个工具常被应用,简单明了;

然后打开另一个终端,pgrep -l A查看进程名和pid


 

pstree -p 26638。以树状图显示进程,并显示进程pid。可见父子进程和线程的关系。


 

ps -T -p 26639 可以查看进程B的线程信息。


 

使用top查看进程cpu和内存信息。

下图为示例:


 

top命令的第三行,cpu状态:

依次对应:

us:user 用户空间占用cpu的百分比

sy:system 内核空间占用cpu的百分比

ni:niced 改变过优先级的进程占用cpu的百分比

id:空闲cpu百分比

wa:IO wait IO等待占用cpu的百分比

hi:Hardware IRQ 硬中断 占用cpu的百分比

si:software 软中断 占用cpu的百分比

st:被hypervisor偷去的时间

top命令第四行,内存状态:

total,free ,used ,buff/cache

依次对应:物理内存总量,空闲内存总量,使用中的内存总量,缓冲内存量

 

进入top后,交互时,输入s,系统提示更改刷新间隔。输入0则不断刷新。


 

top -p 26638查看pid为26638的进程(即A)的信息


 

top -p - H 26639

top命令可以实时显示各个线程情况。要在top输出中开启线程查看,请调用top命令的“-H”选项,该选项会列出所有Linux线程。在top运行时,你也可以通过按“H”键将线程查看模式切换为开或关。


 

四 遇到的问题及解决:

1.编译时出现c++11标准库未定义错误,因为编译器使用的库版本不同。


 

 

解决:使用-l链接 stdc++


 

2. gcc编译时报错


 

解决:

在32位模式时,int 和指针类型变量都占32位在64位模式下,int占32位,指针变量占64位


 

3.如图


 

又是-lstdc++解决

五.实验结果记录:

执行程序A。程序A 父进程fork 出子进程,之后打印Hello, world!然后执行wait(),等待子进程结束。

子进程调用execlp,执行另一个执行体B。

执行体B中线程2开始监控输入。

输入15,是非负整数,之后线程1计算1累加到15.结果为120。120后跟着的15表明计算的是1-15累加。

输入16,是非负整数,之后线程1计算1累加到16.结果为136。136后跟着的16表明计算的是1-16累加。

输入18,之后输入20.线程2监控到由于20与18不同,故线程1不再进行1-18累加,而进行1-20累加。

输出210.

输入25,再输入25.线程2监控到25相同,不需要重新计算,打印信息“输入相同,不需要重新计算”。线程1计算第一个25,输出325.

输入afd。线程2监控,属于其他字符,线程1打印错误信息“input wrong”。

输入fg。线程2监控,属于其他字符,线程1打印错误信息“input wrong”。

输入p,线程1暂停执行。打印信息“pause”表明线程1已暂停。

输入123.线程2检测到是非负整数,先调用恢复函数解除线程1的暂停。之后打印信息“resume”表示线程1已经恢复。之后线程1执行1-123累加,输出7626.

输入e。线程2检测到要退出。之后线程1打印信息“A and B exited”表示主进程,子进程都要退出。之后主进程和子进程都退出。

结束。

추천

출처www.cnblogs.com/lqerio/p/11117626.html