C#-프로세스와 프로세스의 이해

4844 단어 C#c#다중 스레드
정의
프로세스
프로세스(Process)는 Windows 시스템의 기본 개념으로 프로그램을 실행하는 데 필요한 자원을 포함한다.실행 중인 프로그램은 운영체제에서 하나의 프로세스로 간주되며, 프로세스는 하나 이상의 루트를 포함할 수 있다.프로그램은 특정 운영체제에서 실행할 수 있는 파일로 정적 개념이다.프로세스는 프로그램의 동적 개념으로 여겨질 수 있으며 자신의 주소 공간을 가지고 일부 조작을 수행할 수 있다.프로그램의 실행은 프로세스의 생성과 수반되며, 한 프로그램의 실행은 하나 이상의 프로세스를 생성한다.
라인
스레드는 프로세스의 실체로서 독립적으로 운행하고 독립적으로 스케줄링하는 기본 단위이다. (CPU에서 진정으로 운행하는 것은 스레드이다.)루틴 자체는 기본적으로 시스템 자원을 가지고 있지 않으며, 실행 중 없어서는 안 될 자원 (예를 들어 프로그램 카운터, 레지스터, 창고) 만 가지고 있지만, 같은 프로세스에 속하는 다른 루틴과 프로세스가 가지고 있는 모든 자원을 공유할 수 있다.에 있습니다.NET에서는 일반적으로 Main () 방법을 입구로 하는데, 이 방법을 호출하면 자동으로 주 스레드가 생성됩니다.스레드는 CPU 레지스터, 호출 스택, 스레드 로컬 스토리지(Thread Local Storage, TLS)로 구성됩니다.CPU 레지스터는 CPU 내부에서 데이터를 저장하는 데 사용되는 일부 소형 저장 구역으로 연산에 참여하는 데이터와 연산 결과를 잠시 저장한다.사실 레지스터는 흔히 사용하는 시차 논리 회로이지만 이런 시차 논리 회로는 저장 회로만 포함하고 라인에서 현재 실행된 라인의 상태를 주로 기록한다.호출 창고는 실행 중인 하위 프로그램의 되돌아오는 주소를 저장하는 창고입니다. 이 창고는 주로 라인에서 호출된 메모리와 데이터를 유지하는 데 사용되며, 호출 창고에 접근하면 호출된 하위 프로그램을 찾을 수 있습니다.TLS는 정적 및 동적 두 가지로 나뉘는데 그것이 바로 스택의 전역 변수 또는 정적 변수를 바탕으로 데이터에 접근하는 것이다. 주로 데이터와 실행하는 특정한 스레드를 연결하는 데 사용된다.
구별하다
  • 프로세스는 자신의 자원 공간을 가지고 프로세스를 시작할 때마다 시스템이 주소 공간을 분배한다.스레드는 CPU 자원 분배와 상관없이 여러 스레드가 같은 프로세스 내의 자원을 공유하고 같은 주소 공간을 사용한다.하나의 프로세스는 몇 개의 라인을 포함할 수 있다.동일한 프로세스의 스레드 간에 글로벌 변수, 정적 변수 등의 데이터를 공유할 수 있으며, 프로세스 간 통신은 통신 방식(Inter Process Communication, IPC)으로 이루어져야 합니다.그러나 동기화와 배척을 어떻게 처리해야 하는지는 다중 루틴 프로그램을 작성하는 데 어려운 점이다.
  • 다중 프로세스 프로그램은 더욱 건장하다. 다중 프로세스 프로그램은 한 프로세스가 죽으면 전체 프로세스도 죽는다. 한 프로세스가 죽으면 다른 프로세스에 영향을 주지 않는다. 왜냐하면 프로세스는 자신의 독립된 주소 공간이 있기 때문이다.
  • 프로세스는 파이프, 플러그인, 신호 상호작용, 공유 메모리, 메시지 대기열 등을 통해 통신할 수 있다.라인 자체가 메모리를 공유하고 바늘이 같은 내용을 가리키며 상호작용이 쉽다.

  • 다중 스레드
    멀티스레드 단계 만들기:
    1. 라인을 작성하여 실행할 방법.
    2. Thread 클래스를 실례화하고 실행할 방법을 가리키는 의뢰(ThreadStart 또는 ParameterizedThreadStart)를 전달합니다.Thread thread = new Thread (new Thread Start (method) - 이 위임에서 매개 변수로 사용하는 방법에는 매개 변수가 필요하지 않으며 반환 값이 없습니다.별도로 쓰기: ThreadStart threadStart = new ThreadStart(Calculate);Thread thread=new Thread(threadStart); ParameterizedThreadStart는 스레드에 매개 변수를 전달할 수 있는 방법을 의뢰할 수 있습니다. 매개 변수 형식은 Object의 것이어야 합니다.
    3. Thread 실례를 호출하는 Start 방법.thread.Start();
    스레드 속성
    다음 프로그램에는 비교적 자주 사용하는 속성들이 열거되어 있다.
    using System;
    using System.Threading;
    
    namespace    
    {
            class Program
        {
            static void Main(string[] args)
            {
                Thread thread1 = new Thread(new ThreadStart(Thread1));
    
                //thread1.IsBackground = true;//       
                thread1.Start();
    
                //           
                Thread thread=Thread.CurrentThread;
                thread.Name = "    ";
                //            
                int id = thread1.ManagedThreadId;
                //         
                ThreadState state = thread1.ThreadState;
                //          
                ThreadPriority priority = thread1.Priority;
                //    
                //thread1.Suspend();
                    
                //thread1.Abort();
            
                string str = string.Format("Thread ID:{0}
    " + "Thread Name:{1}
    " + "Thread State:{2}
    " + "Thread Priority:{3}
    ", id, thread.Name,state, priority); Console.WriteLine(str); Console.ReadKey(); } static void Thread1() { Console.WriteLine(" !"); } } }

    동기
    스레드의 동기화란 같은 시간에 한 스레드만 변수에 접근할 수 있는 것을 말한다. 다중 스레드 프로그램에 있어 키워드 Lock을 사용해야 한다. 코드를 상호 배척 세그먼트로 정의할 수 있다. 상호 배척 세그먼트는 한 시간 안에 한 스레드만 실행에 들어갈 수 있고 다른 스레드는 기다려야 한다.Lock(expression) {statement block} 클래스의 예를 잠그면this를 사용하고 클래스 내의 방법에서lock(this)을 사용할 수 있습니다.정적 변수를 잠그면 클래스 이름을 사용합니다.
    스레드 간 액세스
    크로스 라인을 완성하려면 방법을 다시 사용해야 한다.
    namespace    1
    {
        public partial class Form1 : Form
        {
                public Form1()
                {
                    InitializeComponent();
                }
    
                //    
                private delegate void setTextValueCallBack();
                //    
                private setTextValueCallBack a;
                
                private void button1_Click(object sender, EventArgs e)
                {
                    //     
                    a = new setTextValueCallBack(SetValue);
                    //             
                    Thread thread = new Thread(new ThreadStart(Test));
                    //          
                    thread.IsBackground = true;
                    thread.Start();
                }
    
                private void Test()
                {
                        //    ,invoke            ,      .invoke(  ,  (       )).invoke    (                )、begininvoke    (         )
                        textBox1.Invoke(a);
                }
    
                /// 
                ///          
                /// 
                private void SetValue()
                {
                    this.textBox1.Text = "1";
                }
            }
    }
    

    참조 링크는 다음과 같습니다. C#다중 스레드

    좋은 웹페이지 즐겨찾기