java的多线程是OS调度还是JVM调度的呢

Python019

java的多线程是OS调度还是JVM调度的呢,第1张

现在java线程和操作系统线程之间的对应关系有三种:

多对一、一对一、多对多

多对一就是所说的“Green thread”,一个java应用程序

被当作一个任务被操作系统调度,而这个java应用程序里

的多个线程则由虚拟机调度执行。也可以说由虚拟机选出

一个多线程java程序里的一个线程作为活动线程,这个线

程再作为操作系统的一个任务被操作系统调度。

一对一就是一个java线程对应一个操作系统线程了,即同

一个多线程java程序里的所有线程都由操作系统统一调度。

多对多还不是很明白。。。

没java的 发段源代码给你 有兴趣自己慢慢理解

#include <time.h>

#include <dos.h>

#include <math.h>

#include <conio.h>

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#include <graphics.h>

#define ESC 0x1b

#define ENTER 0x0d

#define TRUE 1

#define FALSE 0

/*每隔TIME秒就变换一次优先级*/

#define TIME 5

/*数据结构*/

/****************************************************************/

enum _Status/*进程状态枚举*/

{

READY =0,/*就绪*/

RUN,/*执行中*/

SUSPEND,/*挂起*/

}

typedef enum _Status Status

/****************************************************************/

struct _Pcb/*进程结构*/

{

int PID/*进程ID,ID为负数的进程为系统后备队列的作业*/

int Time/*进程运行需要的时间*/

int Prior/*进程的优先级,越大越优先*/

Status Sts/*状态*/

struct _Pcb *Next/*指向本进程队列中下个进程的PCB*/

}

typedef struct _Pcb PCB

/****************************************************************/

struct _Batch/*多道处理中的道结构*/

{

PCB *pcb/*该道当前正在处理的进程*/

struct _Batch *Next/*下一道*/

}

typedef struct _Batch Batch

/****************************************************************/

/*多道系统相关全局变量*/

PCB *ProcQueue = NULL/*进程链表,按优先级从大到小排列*/

Batch *BatchQueue = NULL/*系统多道链表*/

/****************************************************************/

/*动态优先权抢占式调度算法及相关函数声明*/

/****************************************************************/

int InitBatchs(int n)/*初始化多道系统,n为道数*/

int InsertProc(int prior, int time)/*向进程链表中按优先级大小插入一个新进程*/

int InsertIDLE()/*向进程队列中加入后备进程,当系统空闲时将被调入*/

int SortProcQueue()/*将进程链表按优先级从大到小排列*/

int AddBatch()/*增加系统道数*/

int DeleteBatch()/*减少系统道数*/

int UnSuspendProc(int id)/*解除ID为id的进程的挂起状态*/

int UpdateBatchs()/*多道系统根据进程链表进行更新,并将执行完毕的进程删除*/

int PassSeconds(int n)/*系统经过n秒后计算数据并进行优先级调度*/

/****************************************************************/

/*各函数的定义*/

/****************************************************************/

int InitBatchs(int n)

{

int i

for (i=0i<n++i)

{

AddBatch()

}

return (UpdateBatchs())

}

int InsertProc(int prior, int time)

{

static int sysid = 0/*该系统已经加入过多少进程,此值将是新进程的ID*/

PCB *last,*now,*pcb

pcb = (PCB*)malloc(sizeof(PCB))

if (pcb == NULL) return FALSE

pcb->Prior = prior

pcb->Time = time

pcb->PID = (++sysid)

pcb->Sts = READY

if (ProcQueue == NULL)/*如果进程队列为空*/

{

ProcQueue = pcb

pcb->Next = NULL

return TRUE

}

last = ProcQueue

now = last->Next

if (pcb->Prior >last->Prior)/*pcb将排在队头*/

{

pcb->Next = ProcQueue

ProcQueue = pcb

return TRUE

}

while ((now != NULL) &&(pcb->Prior <now->Prior))/*寻找插入位置*/

{

last = now

now = last->Next

}

last->Next = pcb

pcb->Next = now

return TRUE

}

int InsertIDLE()

{

PCB *now = ProcQueue

PCB *idle = (PCB*)malloc(sizeof(PCB))

if (idle == NULL) return FALSE

idle->PID = -1

idle->Prior = -1

idle->Sts = SUSPEND

idle->Time = -1

idle->Next = NULL

if (ProcQueue == NULL)

{

ProcQueue = idle

return TRUE

}

while(now->Next != NULL)

{

now = now->Next

}

now->Next = idle

return TRUE

}

int SortProcQueue()

{ /*冒泡排序*/

PCB *last, *now

int b = FALSE/*上次遍历是否无交换产生*/

if (ProcQueue==NULL || ProcQueue->Next==NULL)/*如果链表中无进程或只有一个进程*/

return FALSE

while (!b)

{

b = TRUE

last=ProcQueue

now=last->Next

if (last->Prior <now->Prior)

{

ProcQueue = now

last->Next = now->Next

now->Next = last

b = FALSE

last = ProcQueue

now = last->Next

}

while (now->Next!=NULL)

{

if ((now->Prior)<(now->Next->Prior))

{

last->Next = now->Next

now->Next = now->Next->Next

last->Next->Next = now

b = FALSE

}

else

last = last->Next

now = last->Next

}

}

return TRUE

}

int AddBatch()

{

Batch *bt = (Batch*)malloc(sizeof(Batch))

if (bt==NULL) return FALSE

bt->Next = BatchQueue

BatchQueue = bt

bt->pcb = NULL

return (InsertIDLE())

}

int DeleteBatch()

{

Batch *bt = BatchQueue

PCB *last, *now

if (BatchQueue==NULL || BatchQueue->Next==NULL)/*如果只剩最后一道则不删除*/

return FALSE

if (ProcQueue==NULL || ProcQueue->Next==NULL)/*如果只有最后一个后备空闲进程*/

return FALSE/**/

last = ProcQueue

now = last->Next

while (now->Next != NULL)/*查找到最后一个进程,该进程必定是后备空闲进程*/

{

last = now

now = last->Next

}

if (now==NULL || now->PID>=0)/*未查找到后备进程*/

return FALSE/**/

free(now)

last->Next = NULL

BatchQueue = BatchQueue->Next

free(bt)

return TRUE

}

int UnSuspendProc(int id)

{

PCB *now = ProcQueue

if (ProcQueue==NULL) return FALSE

while (now != NULL)

{

if (now->PID == id)

{

now->Sts = READY

return TRUE

}

}

return FALSE

}

int UpdateBatchs()

{

Batch *bt = BatchQueue

PCB *last = ProcQueue, *now

while (bt != NULL)

{

bt->pcb = NULL

bt = bt->Next

}

if (ProcQueue == NULL) return TRUE

while (last->Sts==RUN &&last->PID>=0 &&last->Time<=0)

{

ProcQueue = ProcQueue->Next

free(last)

last = ProcQueue

}

now = last->Next

while (now != NULL)

{

if (now->Sts==RUN &&now->PID>=0 &&now->Time<=0)/*如果该进程是运行中的一般进程并已执行完毕*/

{

last->Next = now->Next

free(now)

}

else

last = last->Next

now = last->Next

}

bt = BatchQueue

now = ProcQueue

while (bt != NULL &&now != NULL)

{

bt->pcb = now

now->Sts = RUN

bt = bt->Next

now = now->Next

}

while (now != NULL)

{

if (now->Sts == RUN)

{

now->Sts = SUSPEND

}

now = now->Next

}

return TRUE

}

int PassSeconds(int n)

{

static int time = 0

int i=0, ProcEnd = FALSE

PCB *pcb = ProcQueue

Batch *bt = BatchQueue

if (bt == NULL) return FALSE

time += n

if (time>=TIME)

{

i = time/TIME/*经过多少时间段*/

time = time%TIME

}

while (bt != NULL)/*更新进程运行时间*/

{

if (bt->pcb->PID>=0)

{

bt->pcb->Time -= n

if (bt->pcb->Time <= 0)/*进程结束*/

{

ProcEnd = TRUE

}

}

bt = bt->Next

}

if (i >0)

{

while (pcb != NULL)/*更新进程优先权(动态优先权)*/

{

if (pcb->Sts == RUN &&pcb->PID>=0)/*运行的进程优先权降低*/

{

pcb->Prior -= i

if (pcb->Prior <0)

pcb->Prior = 0

}

else if (pcb->Sts == SUSPEND &&pcb->PID>=0)/*挂起的进程优先权升高*/

pcb->Prior += i

pcb = pcb->Next

}

}

if (i>0)

SortProcQueue()/*如果优先级有变动则重新排序*/

if (ProcEnd || i>0)

{

UpdateBatchs()/*更新多道进程*/

}

return TRUE

}

/****************************************************************/

/*图形界面相关函数*/

/****************************************************************/

/*表格的单位宽度和高度*/

#define WIDTH 64

#define HEIGHT 12

void *black=NULL/*背景色方格,使用它擦出表格中的图形*/

int InitGraph()/*初始化图形界面*/

{

intGraphDriver /* The Graphics device driver */

intGraphMode /* The Graphics mode value */

int ErrorCode

GraphDriver = DETECT /* Request auto-detection */

initgraph( &GraphDriver, &GraphMode, "" )

ErrorCode = graphresult() /* Read result of initialization*/

if( ErrorCode != grOk )

{ /* Error occured during init */

printf(" Graphics System Error: %s\n", grapherrormsg( ErrorCode ) )

getch()

return FALSE

}

cleardevice()

black = (void*)malloc(imagesize(1,1,WIDTH-1,HEIGHT-1))

getimage(1,1,WIDTH-1,HEIGHT-1,black)

DrawFrame()

DrawData()

return TRUE

}

int DrawFrame()/*画边框和表头*/

{

settextjustify(CENTER_TEXT, CENTER_TEXT)

gprintf(320, HEIGHT/2-1, "Multi-Batch System Emulation")

settextjustify(LEFT_TEXT, TOP_TEXT)

moveto(0,HEIGHT)

lineto(0,479)

lineto(639,479)

lineto(639,HEIGHT)

lineto(0,HEIGHT)

line(WIDTH*4,HEIGHT,WIDTH*4,479)

line(WIDTH*7,HEIGHT,WIDTH*7,479)

line(0,HEIGHT*2,639,HEIGHT*2)

line(0,HEIGHT*3,639,HEIGHT*3)

gprintf(HEIGHT*0+2,HEIGHT*1+2,"System Batchs")/*系统多道列表头*/

gprintf(HEIGHT*0+2,HEIGHT*2+2,"Batch")

gprintf(WIDTH*1+2,HEIGHT*2+2,"ProcID")

gprintf(WIDTH*2+2,HEIGHT*2+2,"Time")

gprintf(WIDTH*3+2,HEIGHT*2+2,"Prior")

gprintf(WIDTH*4+2,HEIGHT*1+2,"Suspended Processes")/*挂起队列列表头*/

gprintf(WIDTH*4+2,HEIGHT*2+2,"ProcID")

gprintf(WIDTH*5+2,HEIGHT*2+2,"Time")

gprintf(WIDTH*6+2,HEIGHT*2+2,"Prior")

gprintf(WIDTH*7+2,HEIGHT*1+2,"Ready Processes")/*就绪队列列表头*/

gprintf(WIDTH*7+2,HEIGHT*2+2,"ProcID")

gprintf(WIDTH*8+2,HEIGHT*2+2,"Time")

gprintf(WIDTH*9+2,HEIGHT*2+2,"Prior")

}

int DrawData()/*绘制系统数据*/

{

int numRun=0, numSus=0, numRed=0/*运行挂起和就绪的进程各有多少*/

PCB* now = ProcQueue

int x=0, y=0

while (now != NULL)

{

switch(now->Sts)

{

case RUN:

x = WIDTH*1

y = HEIGHT*(3+(numRun++))

break

case SUSPEND:

x = WIDTH*4

y = HEIGHT*(3+(numSus++))

break

case READY:

x = WIDTH*7

y = HEIGHT*(3+(numRed++))

break

}

if (now->Sts==RUN)/*该进程为正在运行的进程*/

{

putimage(x-WIDTH+1,y+1,black,COPY_PUT)

gprintf(x-WIDTH+2,y+2,"%d",numRun)

}

if (now->PID>=0)/*该进程不是后备进程*/

{

putimage(x+1,y+1,black,COPY_PUT)

gprintf(x+2,y+2,"%d",now->PID)

putimage(x+1+WIDTH,y+1,black,COPY_PUT)

gprintf(x+WIDTH+2,y+2,"%d",now->Time)

putimage(x+1+WIDTH*2,y+1,black,COPY_PUT)

gprintf(x+WIDTH*2+2,y+2,"%d",now->Prior)

}

else

{

putimage(x+1,y+1,black,COPY_PUT)

putimage(x+1+WIDTH,y+1,black,COPY_PUT)

putimage(x+1+WIDTH*2,y+1,black,COPY_PUT)

gprintf(x+2,y+2,"system idle process")

}

now = now->Next

}

}

int DlgGetNum(char *buf,int l,int t,int r,int b,int gettime)

{

char ch

int pos=0

bar(l,t,r,b)

gprintf(l+10,t+5,"Add new Process")

if (gettime)

gprintf(l+10,t+20,"input the time:")

else

gprintf(l+10,t+20,"input the priority:")

while (1)

{

ch = getch()

if (ch == ENTER)/*如果输入了回车键*/

{

if(pos!=0)/*如果位置不在第一位(回车键不准第一个输入)*/

{

buf[pos]='\0'

break

}

}

else if (ch>='0' &&ch<='9')

{

buf[pos++]=ch

buf[pos]='\0'

}

else if (ch == ESC)

{

return FALSE

}

else/*其他按键均按BackSpace处理*/

{

--pos

buf[pos]='\0'

}

if (pos<0)

{ pos=0buf[pos]='\0'}

else if (pos>4)/*最多输入4位数*/

{ pos=4buf[pos]='\0'}

bar(l,t+35,r,t+47)

gprintf(l+50,t+35,buf)

}

return TRUE

}

int NewProcDlg()

{

int l=200,t=150,r=380,b=200,pos=0,prior=0,time=0

char buf[5],ch

PCB *pcb

void* bg = (void*)malloc(imagesize(l,t,r,b))

getimage(l,t,r,b,bg)

setfillstyle(1,2)

flushall()

/*******输入优先级**********/

if (!DlgGetNum(buf,l,t,r,b,FALSE))

goto exit

prior = atoi(buf)

/*******输入时间**********/

pos=0

buf[pos]='\0'

if (!DlgGetNum(buf,l,t,r,b,TRUE))

goto exit

time = atoi(buf)

InsertProc(prior, time)

exit:

putimage(l,t,bg,COPY_PUT)

free(bg)

return TRUE

}

int gprintf( int xloc, int yloc, char *fmt, ... )/*图形系统中的格式输出*/

{

va_list argptr /* Argument list pointer */

char str[140] /* Buffer to build sting into */

int cnt /* Result of SPRINTF for return */

va_start( argptr, format ) /* Initialize va_ functions */

cnt = vsprintf( str, fmt, argptr )/* prints string to buffer */

outtextxy( xloc, yloc, str )/* Send string in graphics mode */

va_end( argptr ) /* Close va_ functions */

return( cnt ) /* Return the conversion count */

}

/****************************************************************/

/*main函数*/

int main()

{

clock_t start=0, end=0

char kb

InitBatchs(3)/*初始化为3道系统*/

InitGraph()

while (1)

{

start = end = clock()

while (!kbhit())

{

start = clock()

if ((start-end)/18.2 >= 1)/*时间过了一秒*/

{

start = end = clock()

PassSeconds(1)

cleardevice()

DrawFrame()

DrawData()

}

}

kb = getch()

switch (kb)

{

case ESC:

closegraph()

return 0

case 'w':

AddBatch()

UpdateBatchs()

cleardevice()

DrawFrame()

DrawData()

break

case 's':

DeleteBatch()

UpdateBatchs()

cleardevice()

DrawFrame()

DrawData()

break

case 'i':

NewProcDlg()

UpdateBatchs()

DrawFrame()

DrawData()

break

}

}

return 0

}

公众:类PrivilegeProcess {

公共静态无效的主要(字串[] args){

MyQueue的MyQueue的新MyQueue的()/ /声明队列

印刷电路板[PCB = {新的PCB(001 ,8,1),新的PCB(002,7,9),新的PCB(003,3,8),新的PCB(004,1,7),新的PCB(005,7,4)}

>PCB段=新的PCB()

(INT I = 0<pcb.length+ +){/ /初始化先进行排序,选择排序这里使用的是高优先级的一线队

(J =我<pcb.lengthJ + +){

(PCB [I]。特权<PCB [J]。特权){

段= PCB [1]

PCB [I] = PCB [J]

PCB [J] =段

}

}

}

体系。通过out.println(“入队后第一时间的进程的顺序:”)

(INT I = 0<pcb.length+ +){

的System.out调用println(第一次入队#程序名称:“+ PCB [我]。名称+ totaltime:”+ PCB [I]。totaltime +“的”特权“+ PCB [我]。特权)}

()

myqueue.start(PCB)

}

}

类MyQueue的{

INT指数= 0

PCB [] PC =新的PCB [5]

PCB [] PC1 =新的PCB [4]

PCB温度=新的PCB() BR />公共无效排队(PCB工艺){/ /排队算法

(指数== 5){

(“出界!”)

返回

}

PC [索引] =进程

指数+ +

}

公共:PCB DEQUEUE(){/ /出队算法(索引== 0)

返回空

(INT I = 0<pc1.length+ +){

PC1 [I] = PC [ +1]

}

指数 -

温度= PC [0]

(INT I = 0<pc1.length+ +){ BR />PC [I] = PC1 [I]

}

回报条件

}

公共无效启动(PCB [] PC){/ /进程表算法

(PC [0]。isNotFinish ==真| | PC [1 isNotFinish ==真| | PC [2 isNotFinish ==真| | PC [3]。时isNotFinish ==真| | PC [4]。isNotFinish ==){

/ / *注:| |运算符都是假的,所有的表达式结果为假,否则真

(INT I = 0<PC长度+ +){

PC [I]。运行(这一点)/>} 的System.out.println()

(INT I = 0<pc.length+ +){/ /处理每个运行一次运行的时间片的长度重新排序优先一旦

(J =我<pc.lengthJ + +){

如果(PC [I]特权<PC [J]。特权){

温度= PC [I]

PC [I] = PC [J]

PC [J] =温度

}

}

}

}

}

}

类PCB {/ /声明过程级

和int名,totaltime ,运行时特权

布尔isNotFinish的

公众PCB(){

}

公开PCB(名称,诠释totaltime特权){

this.name =的名称/ /进程名

this.totaltime = totaltime / /

this.privilege =特权/ /总时间优先 this.runtime = 2 / /时间片值是2

this.isNotFinish =真/ /是否执行完成

(“初始值:程序名称:”+名+“totaltime:”+ totaltime +“特权”+特权)

System.out的。调用println()

}

MyQueue的MQ公共无效的run(){/ /处理的基础上实施的时间片算法

(totalTime>1){ totaltime =运行/ /总时间大于1,总时间=总时间 - 时间片

特权 -

(“程序名称:”+姓名+“ remaintime:“+ +”特权“+特权)totaltime

的} else if(totaltime == 1){

totaltime - / /总时间为1时,执行时间为1

>特权 -

(“程序名称:”+姓名+“remaintime:”+ totaltime +“特权”+特权)

}其他{

isNotFinish =假/ / 0,将isNotFinish标志设置为假

}

如果(isNotFinish ==真){br mq.deQueue() mq.enQueue(本)}

}

}